import re

pat = r'\d{1,3}(?:,\d{3})*(?:\.\d*)?\b'   # \b 表示模式匹配必须以单词边界结尾
s = '12,000 monkeys on 100 typewriters for 53.12 days.'
lst = re.findall(pat,s)
# for item in lst:
#     print(item)

# 先行断言
ss = '''See the U.S.A. today. It's right here, not
a world away. Average temp. is 66.5.'''
pats = r'[A-Z].*?[.!?](?= [A-Z]|$)'  # 如果不满足 [A-Z]|$ 此条件 匹配不到 也就判断没到达句子末尾
# 可用负向先行断言 重写上面的正则表达式，效果都是一样的
# pats = r'[A-Z].*?[.!?](?! [a-z0-9]|\w)'

m = re.findall(pats,ss,flags=re.S|re.MULTILINE)  # 如果不使用 MULTILINE 的话 英文句号后立即换行就没法匹配
# for i in m:
#     print('\n->',i)


# 使用先行断言检查多个模式 检查一个合格的密码
pat1 = r'(\w|[@#$%^&*!+-]){8,12}$'
pat2 = r'(?=.*[a-zA-Z])'    # 必须包含一个字母
pat3 = r'(?=.*\d)'          # 必须包含一个数字
pat4 = r'(?=.*[@#$%^&*!+-])'   # 必须包含一个标点符号

patt = pat2 + pat3 + pat4 + pat1  # 把断言放在模式的开头，正则表达式程序将检查所有这些条件

passwd = 'HenryThe5!'
if re.match(patt,passwd):
    print('It passed the test!')
else:
    print('Insufficiently strong password.')


# 负向先行断言
patt = r'abc(?!abc)'
st = 'The magic of abcabc.'
ms = re.findall(patt,st)
print(ms)


